/*********************************************************************************************************
* 模块名称：Key.c
* 摘    要：LED模块
* 当前版本：1.0.0
* 作    者：多多分享
* 完成日期：2025年01月14日
* 内    容：
* 注    意：
**********************************************************************************************************
* 取代版本：
* 作    者：
* 完成日期：
* 修改内容：
* 修改文件：
*********************************************************************************************************/

/*********************************************************************************************************
*                                              包含头文件
*********************************************************************************************************/
#include "Key.h"
#include "gd32f30x_conf.h"

/*********************************************************************************************************
*                                              宏定义
*********************************************************************************************************/

/*********************************************************************************************************
*                                              枚举结构体
*********************************************************************************************************/

/*********************************************************************************************************
*                                              内部变量定义
*********************************************************************************************************/
static uint8_t s_iKey1State = 0;            //按键状态，0、未按下，1、按下中，2、按键抬起
static uint8_t s_iKey2State = 0;            //按键状态，0、未按下，1、按下中，2、按键抬起
/*********************************************************************************************************
*                                              内部函数声明
*********************************************************************************************************/
static void ConfigKeyGPIO(void);//配置Key的GPIO
static void Key1Scan(void);     //按键扫描
static void Key2Scan(void);     //按键扫描
/*********************************************************************************************************
*                                              内部函数实现
*********************************************************************************************************/
/*********************************************************************************************************
* 函数名称：ConfigKeyGPIO
* 函数功能：配置Key的GPIO
* 输入参数：void
* 输出参数：void
* 返 回 值：void
* 创建日期：2025年01月14日
* 注    意：
*********************************************************************************************************/
static  void  ConfigKeyGPIO(void)
{
    //使能RCU相关时钟
    rcu_periph_clock_enable(RCU_GPIOA);                                 //使能GPIOA的时钟

    gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_0);     //设置GPIO上拉输入模式及速度
    gpio_bit_set(GPIOA, GPIO_PIN_0);                                    //将Key0的默认状态是高电平
    
    gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_1);     //设置GPIO上拉输入模式及速度
    gpio_bit_set(GPIOA, GPIO_PIN_1);                                    //将Key1的默认状态是高电平
    
    gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_2);     //设置GPIO上拉输入模式及速度
    gpio_bit_set(GPIOA, GPIO_PIN_2);                                    //将Key2的默认状态是高电平

}

/*********************************************************************************************************
* 函数名称：Key1Scan
* 函数功能：按键1扫描，判断是否按下
* 输入参数：void
* 输出参数：void
* 返 回 值：void
* 创建日期：2025年01月14日
* 注    意：需每10ms调用一次，用于按键消抖
*********************************************************************************************************/
static void Key1Scan(void)
{
    uint8_t s_iKey1PressFlag = !(gpio_input_bit_get(GPIOA, GPIO_PIN_1)); //key1按下状态
    switch(s_iKey1State){
        case 0:
            if(s_iKey1PressFlag == TRUE){
                s_iKey1State = 1;
            }
            break;
        case 1:
           if(s_iKey1PressFlag == TRUE){
                s_iKey1State = 2; //确认按键按下
               //执行按下操作,调用回调函数
               Key1PressCallBack();
            } else {
                s_iKey1State = 0; //按键抖动
            }
            break;
        case 2:
            if(s_iKey1PressFlag == FALSE){
                s_iKey1State = 0; //松开按键后回到未按下状态      
                Key1ReleaseCallBack();
            }
            break;
        default:
            break;
    }
}

/*********************************************************************************************************
* 函数名称：Key2Scan
* 函数功能：按键2扫描，判断是否按下
* 输入参数：void
* 输出参数：void
* 返 回 值：void
* 创建日期：2025年05月23日
* 注    意：需每10ms调用一次，用于按键消抖
*********************************************************************************************************/
static void Key2Scan(void)
{
    uint8_t s_iKey2PressFlag = !(gpio_input_bit_get(GPIOA, GPIO_PIN_2)); //key2按下状态
    switch(s_iKey2State){
        case 0:
            if(s_iKey2PressFlag == TRUE){
                s_iKey2State = 1;
            }
            break;
        case 1:
           if(s_iKey2PressFlag == TRUE){
                s_iKey2State = 2; //确认按键按下
               //执行按下操作,调用回调函数
               Key2PressCallBack();
            } else {
                s_iKey2State = 0; //按键抖动
            }
            break;
        case 2:
            if(s_iKey2PressFlag == FALSE){
                s_iKey2State = 0; //松开按键后回到未按下状态      
                Key2ReleaseCallBack();
            }
            break;
        default:
            break;
    }
}

/*********************************************************************************************************
*                                              API函数实现
*********************************************************************************************************/
/*********************************************************************************************************
* 函数名称：InitKey
* 函数功能：初始化Key模块
* 输入参数：void
* 输出参数：void
* 返 回 值：void
* 创建日期：2025年01月14日
* 注    意：
*********************************************************************************************************/
void InitKey(void)
{
    ConfigKeyGPIO();  //配置Key的GPIO
}
/*********************************************************************************************************
* 函数名称：KeyScan
* 函数功能：用于控制按键扫描时间间隔
* 输入参数：void
* 输出参数：void
* 返 回 值：void
* 创建日期：2025年01月14日
* 注    意：每2ms调用一次，10ms调用一次具体按键扫描函数，用于按键消抖
*********************************************************************************************************/
void KeyScan(uint16_t count)
{
    static uint16_t s_iCnt = 0;
    
    s_iCnt++;
    
    if(s_iCnt >= count){
        s_iCnt = 0;
        Key1Scan();
        Key2Scan();
    }
}

/*********************************************************************************************************
* 函数名称：Key1PressCallBack
* 函数功能：按键1按下回调函数，需要按键处理操作
* 输入参数：void
* 输出参数：void
* 返 回 值：void
* 创建日期：2025年01月14日
* 注    意：按键按下操作事件需要重写该函数
*********************************************************************************************************/
__weak void Key1PressCallBack(void)
{
    //按下按键操作
    ;
}

/*********************************************************************************************************
* 函数名称：Key1ReleaseCallBack
* 函数功能：按键1释放回调函数，需要按键处理操作
* 输入参数：void
* 输出参数：void
* 返 回 值：void
* 创建日期：2025年01月14日
* 注    意：按键释放操作事件需要重写该函数
*********************************************************************************************************/
__weak void Key1ReleaseCallBack(void)
{
    //释放按键操作
    ;
}

/*********************************************************************************************************
* 函数名称：Key2PressCallBack
* 函数功能：按键2按下回调函数，需要按键处理操作
* 输入参数：void
* 输出参数：void
* 返 回 值：void
* 创建日期：2025年05月23日
* 注    意：按键按下操作事件需要重写该函数
*********************************************************************************************************/
__weak void Key2PressCallBack(void)
{
    //按下按键操作
    ;
}

/*********************************************************************************************************
* 函数名称：Key2ReleaseCallBack
* 函数功能：按键1释放回调函数，需要按键处理操作
* 输入参数：void
* 输出参数：void
* 返 回 值：void
* 创建日期：2025年05月23日
* 注    意：按键释放操作事件需要重写该函数
*********************************************************************************************************/
__weak void Key2ReleaseCallBack(void)
{
    //释放按键操作
    ;
}

